package com.tedu.API.thread;

import org.junit.Test;
import org.junit.experimental.theories.ParametersSuppliedBy;

import java.io.File;
import java.io.FileFilter;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Lambda表达式-->  ()->{} 【接口/抽象类--匿名内部类】
 *                        【集合遍历--匿名内部类】
 *  Collection--->List:存重复元素并且有序【保存数据结构一致】
 *                Set：存无序并且不重复【保存数据结构一致】
 *                Queue：队列结合业务
 * Map---->HashMap:键值对存储
 *
 */
public class LambdaDemo {
    @Test
    public void testList() {
        //List集合：保存元素
        List<String> list = new ArrayList<>();
        list.add("白洋淀");
        list.add("正定古城");
        list.add("河头老街");
        list.add("白石山");
        //集合3种遍历方式：普通for，增强for，forEach方法
        for (String str : list) {
            System.out.println("增强for：" + str);
        }
        //支持forEach方法: 遍历集合元素 Consumer针对List集合接口
        //Consumer接口针对List集合提供接口:功能获取list集合元素
        //accept()获取list集合的所有元素
        list.forEach(new Consumer<String>() {
            public void accept(String s) {
                System.out.println("consumer接口遍历方案:" + s);
            }
        });
        //支持forEach方法：遍历集合元素【Consumer 匿名内部类】
        //编写Lambda表达式写法
        list.forEach(s -> System.out.println("Lambda方案:" + s));
    }

    @Test
    public void testMap() {
        //创建Map集合：键值对
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "唐山");
        map.put(2, "石家庄");
        map.put(3, "邯郸");
        map.put(4, "秦皇岛");
        //遍历集合:普通for、增for、forEach(BiConSummer接口--匿名内部类
        //键值对-->一组Entry对象
        //BiConSummer接口---获取每组Entry对象---accept()获取Entry对象
        map.forEach(new BiConsumer<Integer, String>() {
            public void accept(Integer integer, String s) {
                System.out.println("键：" + integer + "值：" + s);
            }

        });

        //使用Lambda表达式
        map.forEach((i, s) -> System.out.println("Lambda键：" + i));
    }

/**
 * 作业：  1.使用Lambda表达式完成 Thread 线程创建
 *        2.使用Lambda表达式完成 Runnable线程创建
 *        3.IO流---File类：listFile（FileFilter接口）【5行代码】
 *         目标：【io包下FilterAPI类】实现使用Lambda表达式完成
 *        4.I0流--File类:ListFile(FileFilter接口）【2行代码】
 *          目标:【io包FilterAPI类】实现使用Lambda表达式完成
 *        5.集合：改成lambda写法
 *          目标：【list包下ListAPI类下单元测试：testComparator（）】
 *
 * @LambdaHomeWork1
 * @LambdaHomeWork2 .......................
 */
public void LambdaHomeWork1(){
    //使用Lambda表达式完成 Thread 线程创建
    //Thread类 Java定义线程类--具备启动start---
    //Thread类内嵌Runnable类--线程run运行
    Thread t1=new Thread(()->{for(int i=0;i<1000;i++){
        System.out.println("给我学的呀，One愣One愣的");
    }});
    t1.start();
}

public void LambdaHomeWork2(){
    Runnable mr1 = (() -> {
        for (int i = 0; i < 1000; i++) {
            System.out.println("牛蛙饭你发");
        }
    });
//②创建Thread线程类---start（）
    Thread t2 = new Thread(mr1);
    //③启动线程
    t2.start();


}
public void LambdaHomeWork3(){
    File file=new File("."+File.separator,"API");
    FileFilter my=(pathname -> {return pathname.getName().startsWith("s");});
    File[] subs=file.listFiles(my);
    for(int i=0;i<subs.length;i++){
        System.out.println("所有的文件和文件夹的名"+subs[i].getName());
    }

}
@Test
    public void LambdaHomeWork4(){
    for(File f:new File("."+File.separator+"API").listFiles((pathname)->
    {return pathname.getName().startsWith("s");})){
        System.out.println("遍历后过滤完成："+f);
    }
    }
    @Test
    public void LambdaHomework5 (){
        List<String> list=new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        Comparator<String> com= (o1, o2) -> o1.length()-o2.length();
        Collections.sort(list);
        System.out.println("排序后集合："+list);
    }
}



